package framework.forms;

import org.openqa.selenium.By;

import framework.BaseForm;
import framework.elements.Button;
import framework.elements.Label;
import framework.elements.Link;

/** Базовая форма с верхним меню.
 */

public class BaseFormWithTopMenu extends BaseForm{

	/** Базовый конструктор.
	 * @param titleLocator локатор
	 * @param title название формы
	 */
	protected BaseFormWithTopMenu(final By titleLocator, final String title) {
		super(titleLocator, title);
	}
	private final String topMenuItemTemplate = "//div[@id='pmenu']//ul//li[@id='%s']//a";
	private static Label publishInfoLbl = new Label(By.xpath("//div[@class='jquery-msgbox-wrapper jquery-msgbox-confirm']/form"),"Сообщение о публикации");
	private static Button publichBtn = new Button(By.xpath("//div[@class='jquery-msgbox']//button[contains(.,'Опубликовать')]"), "Опубликовать");
	private static Button continueBtn = new Button(By.xpath("//div[@class='jquery-msgbox-buttons']/button[contains(.,'Продолжить')]"), "Продолжить");
	private static String dataTemplate = "//table[%s]//tbody//tr[%s]//td[2]/span";
	private static final Link EXIT_LNK = new Link(By.xpath("//a/cufon[@alt='Выход']"),"Выход");
	private static Label messageInDialog = new Label(By.xpath("//div[contains(@role,'dialog')]"),"Сообщение в диалоге");
	private static String errorLabel = "//*[contains(@class,'error')][contains(.,'%s')]";
	//  Переход на следующую страницу по ссылке "Следующая" внизу страницы
	private final Link nextLnk = new Link(By.xpath("//ul[@class='pager']//li/a[contains(.,'Следующая')]"), "Следующая");

	/** Кликает по ссылке "Следующая" в низу страницы
	 * @return true - если есть еще страницы с записями
	 */
	public Boolean nextPage(){
		if(nextLnk.isPresent()){
			nextLnk.clickAndWait();
			if(nextLnk.isPresent()){
				return true;
			}else{
				logger.info("Уже открыта последняя страница с записями");
				return false;
			}
		}else{
			logger.info("Уже открыта последняя страница с записями");
			return false;
		}
	}

	/** Возвращает шаблон локатора к полю таблицы
	 * @return шаблон локатора к полю таблицы
	 */
	public String getDataTemplateLocator(){
		return dataTemplate;
	}

	/** Нажимает на кнопку "Выход" и ждет перехода на главную сайта
	 */
	public void clickExit(){
		EXIT_LNK.clickAndWait();
		new MainForm();
	}

	/** Возвращает поле с сообщением о публикации
	 * @return "Сообщение о публикации"
	 */
	public static Label getPublishInfoLbl(){
		return publishInfoLbl;
	}

	/** Возвращает кнопку "Опубликовать"
	 * @return кнопка "Опубликовать"
	 */
	public static Button getPublishBtn(){
		return publichBtn;
	}

	/** Возвращает кнопку "Продолжить" диалогового окна
	 * @return кнопка "Продолжить"
	 */
	public static Button getContinueBtn(){
		return continueBtn;
	}

	/** Верхнее меню
	 */
	public enum TOP_MENU{
		GLAVNAYA("Главная");

		private String	val;

		/** Задает название для пункта меню
		 * @param name наименование
		 */
		TOP_MENU(final String name) {
			val = name;
		}

		@Override
		public String toString() {
			return val;
		}
	}

	/**
	 * Производит навигацию по верхнему меню
	 * @param item пункт меню
	 * @return базовая форма с меню вверху
	 */
	public final BaseFormWithLeftSlideBar navigateToTopMenu(final TOP_MENU item){
		Link l = null;
		switch(item){
			case GLAVNAYA:
				l = new Link(By.xpath(String.format(topMenuItemTemplate, "menu-1")),item.toString());
				l.clickThrowException();
				return new MainForm();
			default:
				return new MainForm();
		}
	}

	/**
	 * Проверить сообщение во всплывающем диалоге
	 * @param msg msg
	 */
	public final void checkMessageInDialogPresent(String msg) {
		String actualText = messageInDialog.getText();
		jassert.assertTrue("Ошибка! Сообщение " + msg + " не найдено!","Сообщение " + msg + " найдено!", actualText.contains(msg),true);
	}


	/**
	 * Проверить сообщение об ошибке
	 * @param msg msg
	 */
	public final void checkValidationMessagePresent(String msg) {
		jassert.assertTrue("Ошибка! Сообщение об ошибке <" + msg + "> не найдено!","Сообщение об ошибке <" + msg + "> найдено!",
				new Label(By.xpath(String.format(errorLabel, msg.split("'")[0])),msg).isPresent(),true);
	}

	/**
	 * Проверить сообщение во всплывающем диалоге
	 * @param msg msg
	 */
	public final void checkMessageInDialogPresent(String[] msg) {
		for (String m : msg) {
			checkMessageInDialogPresent(m);
		}
	}
}
